home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Turnbull China Bikeride
/
Turnbull China Bikeride - Disc 1.iso
/
HENSA
/
GRAPHICS
/
SPRite_TOOLS.ARC
/
c
/
spr_diff
< prev
next >
Wrap
Text File
|
1998-04-06
|
7KB
|
181 lines
/************************************************************************
* *
* spr_diff.c *
* *
* Calculates various measeures of how different two sprites are. *
* For use with sprites of the same size, but can have differing BPP. *
* Aimed mainly as a test of how close an image is to the original *
* after spr_fsi processing. *
* *
* Version 1.01 (13-Sep-1994) *
* 1.02 (06-Apr-1998) File opened as binary *
* *
* (C) 1993-8 DEEJ Technology PLC *
* *
************************************************************************/
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include "io.h"
#include "sprite.h"
int main(int argc, char** argv)
{
FILE *inf1, *inf2;
int x,y;
int size;
uint rgb;
uint r1, g1, b1;
uint r2, g2, b2;
int rd, gd, bd;
int rv, gv, bv;
spr_info_str spr1, spr2;
double total_lsq = 0;
int total_intn = 0;
int total_chrom = 0;
int total_accum = 0;
int total_red = 0;
int total_green = 0;
int total_blue = 0;
double lsq_diff = 0;
int intn_diff = 0;
int chrom_diff = 0;
int accum_diff = 0;
int red_diff = 0;
int green_diff = 0;
int blue_diff = 0;
/* cant use file_args() as using two input files */
if(argc!=3)
{
fprintf(stderr,"Syntax: %s <sprite> <sprite>\n", argv[0]);
return(1);
}
if((inf1 = fopen(argv[1],"rb")) == 0)
{
fprintf(stderr,"Could not open sprite 1\n");
return(2);
}
if((inf2 = fopen(argv[2],"rb")) == 0)
{
fprintf(stderr,"Could not open sprite 2\n");
return(3);
}
read_sprite(&spr1, inf1);
read_sprite(&spr2, inf2);
if(spr1.X != spr2.X && spr1.Y != spr2.Y)
{
fprintf(stderr,"Sprites have different sizes\n");
return(40);
}
progress_start("Comparing sprites :");
for(y=0; y<spr1.Y; y++)
{
for(x=0; x<spr1.X; x++)
{
rgb = spr1.read_pixel_rgb(&spr1, x, y);
r1 = (rgb >> 8) &0xFF;
g1 = (rgb >> 16) &0xFF;
b1 = (rgb >> 24) &0xFF;
rgb = spr2.read_pixel_rgb(&spr2, x, y);
r2 = (rgb >> 8) &0xFF;
g2 = (rgb >> 16) &0xFF;
b2 = (rgb >> 24) &0xFF;
rd = r1>r2 ? r1-r2 : r2-r1;
gd = g1>g2 ? g1-g2 : g2-g1;
bd = b1>b2 ? b1-b2 : b2-b1;
rv = (r1+r2)/2;
gv = (g1+g2)/2;
bv = (b1+b2)/2;
total_red += rv;
red_diff += rd;
total_green += gv;
green_diff += gd;
total_blue += bv;
blue_diff += bd;
accum_diff += (r1-r2)+(g1-g2)+(b1-b2);
}
progress(y, spr1.Y);
}
progress_finish();
size = spr1.X * spr1.Y;
lsq_diff = sqrt((double)red_diff*(double)red_diff +
(double)green_diff*(double)green_diff +
(double)blue_diff*(double)blue_diff) /
sqrt((double)10.0);
total_lsq = sqrt((double)total_red*(double)total_red +
(double)total_green*(double)total_green +
(double)total_blue*(double)total_blue) /
sqrt((double)10.0);
intn_diff = (red_diff*3 +
green_diff*6 +
blue_diff) / 10;
total_intn = (total_red*3 +
total_green*6 +
total_blue) / 10;
chrom_diff = (red_diff +
green_diff +
blue_diff) / 3;
total_chrom = (total_red +
total_green +
total_blue) / 3;
if(accum_diff < 0) accum_diff = -accum_diff;
total_accum = red_diff + green_diff + blue_diff;
if(total_accum == 0) total_accum = 1;
printf("Least Squares difference : %-10.0f %6.2f%%\n",
lsq_diff,
lsq_diff*100.0/total_lsq);
printf("Least Squares diff average : %-10.0f %6.2f%%\n",
lsq_diff/(double)size,
lsq_diff*100.0/((double)size*255.0));
printf("Intensity difference : %-10d %6.2f%%\n",
intn_diff,
(double)intn_diff*100.0/(double)total_intn);
printf("Intensity diff average : %-10d %6.2f%%\n",
intn_diff/size,
(double)intn_diff*100.0/((double)size*255.0));
printf("Chrominance difference : %-10d %6.2f%%\n",
chrom_diff,
(double)chrom_diff*100.0/(double)total_chrom);
printf("Chrominance diff average : %-10d %6.2f%%\n",
chrom_diff/size,
(double)chrom_diff*100.0/((double)size*255.0));
printf("Red difference : %-10d %6.2f%%\n",
red_diff,
(double)red_diff*100.0/(double)total_red);
printf("Green difference : %-10d %6.2f%%\n",
green_diff,
(double)green_diff*100.0/(double)total_green);
printf("Blue difference : %-10d %6.2f%%\n",
blue_diff,
(double)blue_diff*100.0/(double)total_blue);
printf("Accumulated difference : %-10d %6.2f%%\n",
accum_diff,
(double)accum_diff*100.0/(double)total_accum);
fclose(inf1);
fclose(inf2);
}